import axios from 'axios'
import router from '../router'

const apiClient = axios.create({
  baseURL: 'http://localhost:8080',
  timeout: 100000, // 请求超时时间
  withCredentials: true, // 跨域请求时携带 cookie
})

// 添加全局响应拦截器，遇到401跳转到/session-expired
axios.interceptors.response.use(
  response => {
    console.log(response)
    return response
  },
  error => {
    if (error.response && error.response.status === 401) {
      router.push('/session-expired')
    }
    return Promise.reject(error)
  }
)

export default {
  /**
   * 用户注册
   * @param {Object} registerData - 注册请求数据
   * @returns {Promise} - Axios Promise
   */
  registerUser(registerData) {
    return apiClient.post('/api/auth/register/submit', registerData)
  },

  /**
   * 验证码验证（注册）
   * @param {Object} captchaData - 验证码请求数据
   * @returns {Promise} - Axios Promise
   */
  verifyRegisterCode(captchaData) {
    return apiClient.post('/api/auth/register/verify', captchaData)
  },

  /**
   * 用户登录
   * @param {string} identifier - 用户名或邮箱
   * @returns {Promise} - Axios Promise
   */
  loginUser(identifier) {
    return apiClient.post(`/api/auth/login/submit?identifier=${identifier}`)
  },

  /**
   * 验证码验证（登录）
   * @param {Object} captchaData - 验证码请求数据
   * @returns {Promise} - Axios Promise
   */
  verifyLoginCode(captchaData) {
    return apiClient.post('/api/auth/login/verify', captchaData)
  },

  /**
   * 申请邮箱
   * @param {string} identifier - 用户名或邮箱
   * @returns {Promise} - Axios Promise
   */
  applyEmail(identifier) {
    return apiClient.post(`/api/auth/apply-email?identifier=${identifier}`)
  },

  /**
   * 获取通知消息
   * @returns {Promise} - Axios Promise
   */
  getNotifications() {
    return apiClient.get('/api/notify/pull')
  },

  /**
   * 用户登出
   * @returns {Promise} - Axios Promise
   */
  logoutUser() {
    return apiClient.get('/api/auth/logout')
  },
  /**
   * 获取支付宝信息
   * @param {Object} params - 查询参数，包含 timestamp、total_amount 等
   * @returns {Promise} - Axios Promise
   */
  getAlipayInfo(params) {
    return apiClient.get('/api/alipay', { params })
  },

  /**
   * 发起支付宝支付
   * @param {number} price - 支付金额
   * @returns {Promise} - Axios Promise
   */
  alipayPay(price) {
    return apiClient.get('/api/alipay/pay', { params: { price } })
  },

  /**
   * 取消支付宝支付
   * @returns {Promise} - Axios Promise
   */
  alipayCancel() {
    return apiClient.get('/api/alipay/cancel')
  },

  /**
   * 支付宝支付回调
   * @param {Object} params - 回调参数，包含 trade_status、out_trade_no 等
   * @returns {Promise} - Axios Promise
   */
  alipayNotify(params) {
    return apiClient.post('/api/alipay/notify', null, { params })
  },

  /**
   * 获取支付宝支付历史
   * @returns {Promise} - Axios Promise
   */
  getAlipayHistory() {
    return apiClient.get('/api/alipay/history')
  },

  /**
   * 获取我的预约记录
   * @returns {Promise} - Axios Promise
   */
  getMyBookings() {
    return apiClient.get('/api/bookings/my-bookings')
  },

  /**
   * 取消预约
   * @param {number} bookingId - 预约ID
   * @returns {Promise} - Axios Promise
   */
  cancelBooking(bookingId) {
    return apiClient.delete(`/api/bookings/${bookingId}/cancel`)
  },

  /**
   * 参会接口
   * @param {number} meetingId - 会议ID
   * @returns {Promise} - Axios Promise
   */
  joinMeeting(meetingId) {
    return apiClient.post(`/api/attend/join?meetingId=${meetingId}`)
  },

  /**
   * 管理员-导出报表
   * @returns {Promise} - Axios Promise
   */
  exportReport() {
    return apiClient.get('/admin/exportReport', { responseType: 'blob' })
  },

  /**
   * 管理员-Kafka可视化
   * @returns {Promise} - Axios Promise
   */
  getKafkaStatus() {
    return apiClient.get('/admin/kafkaStatus')
  },

  /**
   * 管理员-Redis可视化
   * @returns {Promise} - Axios Promise
   */
  getRedisStatus() {
    return apiClient.get('/admin/redisStatus')
  },

  /**
   * 管理员-Redis详细信息
   * @returns {Promise} - Axios Promise
   */
  getRedisDetails() {
    return apiClient.get('/admin/redisDetails')
  },

  /**
   * 管理员-获取统计数据
   * @returns {Promise} - Axios Promise
   */
  getAdminStats() {
    return apiClient.get('/admin/stats')
  },

  /**
   * 获取所有会议室及其空闲时段
   * @param {string} start - 起始时间（ISO字符串）
   * @param {string} end - 结束时间（ISO字符串）
   * @returns {Promise} - Axios Promise
   */
  getRoomsWithSlots(start, end) {
    return apiClient.get('/api/bookings/rooms-with-slots', {
      params: { start, end }
    })
  },

  /**
   * 检查用户是否已登录
   * @returns {Promise} - Axios Promise
   */
  checkLogin() {
    return apiClient.get('/api/auth/check-login')
  },

  /**
   * 获取用户信息
   * @returns {Promise} - Axios Promise
   */
  getUserInfo() {
    return apiClient.get('/api/auth/user-info')
  },

  /**
   * 获取会议室预约配置
   * @returns {Promise} - Axios Promise
   */
  getBookingConfig() {
    return apiClient.get('/api/bookings/config')
  },

  /**
   * 获取所有会议室列表
   * @returns {Promise} - Axios Promise
   */
  getAllRooms() {
    return apiClient.get('/api/bookings/rooms')
  },

  /**
   * 获取指定会议室在某天的空闲时间段
   * @param {number|string} roomId - 会议室ID
   * @param {string} start - 起始时间（ISO字符串）
   * @param {string} end - 结束时间（ISO字符串）
   * @returns {Promise} - Axios Promise
   */
  getFreeSlotsForRoom(roomId, start, end) {
    console.log('获取指定会议室在某天的空闲时间段', roomId, start, end)
    const date = start.split('T')[0]
    return apiClient.get(`/api/bookings/room/${roomId}/free-slots?date=${date}`)
  },

  /**
   * 获取所有会议室在某天的空闲时间段
   * @param {string} start - 起始时间（ISO字符串）
   * @param {string} end - 结束时间（ISO字符串）
   * @returns {Promise} - Axios Promise
   */
  getFreeSlotsForAllRooms(start, end) {
    console.log('获取所有会议室在某天的空闲时间段', start, end)
    return apiClient.get('/api/bookings/free-slots', {
      params: { start, end }
    })
  },

  /**
   * 预约会议室
   * @param {number|string} roomId - 会议室ID
   * @param {string} start - 开始时间（ISO字符串）
   * @param {string} end - 结束时间（ISO字符串）
   * @param {string} topic - 会议主题
   * @returns {Promise} - Axios Promise
   */
  bookRoom(roomId, start, end, topic) {
    return apiClient.post(`/api/bookings/room/${roomId}/book?start=${start}&end=${end}&topic=${topic}`)
  },

  adminLogin(username, password) {
    return apiClient.post('/admin/login', null, { params: { username, password } })
  },
  adminLogout() {
    return apiClient.post('/admin/logout')
  },
  adminCheck() {
    return apiClient.get('/admin/check')
  },
  adminStats() {
    return apiClient.get('/admin/stats')
  },
  adminExportReport() {
    return apiClient.get('/admin/exportReport', { responseType: 'blob' })
  },
  adminKafkaStatus() {
    return apiClient.get('/admin/kafkaStatus')
  },
  adminRedisStatus() {
    return apiClient.get('/admin/redisStatus')
  },
  getJoinableMeetings() {
    return apiClient.get('/api/bookings/joinable-meetings')
  },
  get(uri) {
    return apiClient.get(uri)
  }
}
